第7章 Java的12个原子操作类

前言

  • AtomicBoolean
  • AtomicInteger
  • AtomicLong

  • AtomicIntegerArray :原子更新Integer数组

  • AtomicLongArray
  • AtomicReferenceArray

  • AtomicReference :原子更新引用类型

  • AtomicReferenceFieldUpdater : 源自更新引用类型里的字段
  • AtomicMarkableReference :源自更新带标记位的引用类型。

  • AtomicIntegerFieldUpdate :原子更新整形的字段更新器

  • AtomicLongFieldUpdate :原子更新长整形字段的更新器
  • AtomicStampedReference :使用版本号来区别变量,可以避免CAS可能出现的ABA问题

🖊

原子更新基本类

  • AtomicBoolean
  • AtomicInteger
  • AtomicLong

使用

以AtomicInteger为例,常用方法:

1
2
3
4
5
6
7
8
9
int addAndGet(int delta);	// 增加delta值后,返回结果

boolean compareAndSet(int expect, int update); // CAS操作

int getAndIncrement(); // 当前值+1,返回旧值

void lazySet(int newValue); // 在一小段时间后修改值,在这之前还是旧值

int getAndSet(int newValue); // 设置新值后返回旧值

原子更新数组

  • AtomicIntegerArray

  • AtomicLongArray

  • AtomicReferenceArray

使用

构造方法

  • public AtomicIntegerArray( int length ) 声明一个空的限长的数组

  • public AtomicIntegerArray( int[] value ) 拷贝一份数组,作为本数组的元素(注意,这些是复制,不是原数组!对数组元素修改不影响原数组!)

示例:

1
2
int[] value = new int[] {1,2};
AtomicIntegerArray ai = new AtomicIntegerArray(value); // 注意这里的是拷贝,不是原数组!

常用方法

1
2
3
int addAndGet(int i, int delta);	// 将第i个元素与delta相加

boolean compareAndSet(int i, int expect, int update); // 如果符合预期,则将第i个元素替换

原子更新引用类型

  • AtomicReference :原子更新引用类型
  • AtomicReferenceFieldUpdater : 源自更新引用类型里的字段
  • AtomicMarkableReference :源自更新带标记位的引用类型。

原子更新字段类

  • AtomicIntegerFieldUpdate :原子更新整形的字段更新器
  • AtomicLongFieldUpdate :原子更新长整形字段的更新器
  • AtomicStampedReference :使用版本号来区别变量,可以避免CAS可能出现的ABA问题

使用

构造

这些类都是抽象类,要用其自带的工厂方法生成一个实例更新器

1
AtomicIntegerFieldUpdater.newUpdater(User.class, "old");	// 设置想要更新的类和属性,这个old变量必须用volatile修饰

本文标题:第7章 Java的12个原子操作类

文章作者:Aaron.H

发布时间:2018年06月05日 - 18:06

最后更新:2018年09月10日 - 17:09

原始链接:https://uncleaaron.github.io/Blog/Java/Java并发编程艺术/第7章 Java的13个原子操作类/

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。